<?php

namespace backend\controllers;

use common\models\BizUser;
use  yii\web\Controller;
use Yii;
use backend\models\User;
use backend\models\Goods;

class UserController extends Controller{
    /**
     * 获取单个商品
     */
    public function actionGetOne() {
        $data= Goods::findOne(1)->toArray();
        p($data);
        $data=Goods::findAll([1,2,3]);
         p($data[0]->goods_name);
        $data=Goods::find()->where(['goods_id'=>3])->one();
        p($data->goods_id);
    }

    /**
     * 用模型构建查询
     * 在模型中重写primaryKey(),tableName(),attributes(),attributeLabels() 这些方法，避免父类再去执行sql查询
     */
    public function actionModelSql(){


        $ob= new Goods();
        // $ob->goods_name='苹果电脑';
        p(Goods::primaryKey());

        p(Goods::tableName());
        p($ob->attributes());
        p($ob->getAttribute('goods_id'));
        p($ob->attributeLabels());
        p(Goods::getTableSchema());
    }

    public function actionAddGoods(){

    }

    //开启事务
    /**
     * Yii 为四个最常用的隔离级别提供了常量：

    yii\db\Transaction::READ_UNCOMMITTED - 最弱的隔离级别，脏读、不可重复读以及幻读都可能发生。
    yii\db\Transaction::READ_COMMITTED - 避免了脏读。
    yii\db\Transaction::REPEATABLE_READ - 避免了脏读和不可重复读。
    yii\db\Transaction::SERIALIZABLE - 最强的隔离级别， 避免了上述所有的问题。
     * @throws \Throwable
     */
    public function actionTransaction(){
        //隔离级别
        $isolationLevel = \yii\db\Transaction::REPEATABLE_READ;
        $db=Yii::$app->db;
        $transaction=$db->beginTransaction($isolationLevel);
        try{
            $db->createCommand('update goods set goods_num=:goods_num where goods_id=1')
                ->bindValue(':goods_num','100')->execute();

            $transaction->commit();
        }catch (\Exception $e){
            $transaction->rollBack();
            throw $e;
        }catch(\Throwable $e){
            $transaction->rollBack();
            throw $e;
        }
    }

    /**
     * 创建查询
     * all()：将返回一个由行组成的数组，每一行是一个由名称和值构成的关联数组（译者注：省略键的数组称为索引数组）。
    one()：返回结果集的第一行。
    column()：返回结果集的第一列。
    scalar()：返回结果集的第一行第一列的标量值。
    exists()：返回一个表示该查询是否包结果集的值。
    count()：返回 COUNT 查询的结果。
    其它集合查询方法：包括 sum($q), average($q), max($q), min($q) 等。$q 是一个必选参数， 既可以是一个字段名称，又可以是一个 DB 表达式。
     */
    public function actionQuery(){
        $query = new yii\db\Query();
        $mobile = '13253602577';
        $data = $query->select("uid,phone")->from('buy_user')->where(['phone'=>$mobile])
            ->limit(10)->all();
        p($data);

        $data=$query->select(['uid','phone'])->from('buy_user')->where(['like','phone',$mobile.'%'])
            ->andWhere(['uid'=>'1'])->filterWhere(['sex'=>1])
            ->orderBy('uid DESC')->orderBy(['phone'=>SORT_ASC])
            ->groupBy('uid')->having(['biz_id'=>1])
            ->limit(3)->offset(20)->all();
        p($data);

        $command = $query->select(['uid','phone'])->from('buy_user')->where(['like','phone',$mobile.'%'])
            ->andWhere(['uid'=>'1'])->filterWhere(['sex'=>1])
            ->orderBy('uid DESC')->orderBy(['phone'=>SORT_ASC])
            ->groupBy('uid')->having(['uid'=>1])
            ->limit(3)->offset(20)->createCommand();
        $sql = $command->getRawSql(); //生成已经绑定参数的sql
        p($sql); //打印sql
        $sql = $command->getSql();//生成还未绑定参数的sql
        p($sql);


        $data = $query->select(['u.uid','u.mobile','u.biz_id'])->from('by_user as u')
            ->innerJoin('by_biz_user as b','b.id=a.biz_id')->limit(10)->all();
        p($data);
    }

    //数据库查询
    public function actionSql(){
        $request = Yii::$app->request;

        $query=Goods::find()->where("status<>:status",[':status'=>1]);
        $count =  $query->count();
        p($count);
        $data=Yii::$app->db->createCommand('SELECT count(*) FROM goods  ')
            ->queryScalar();
        p($data);

        $command=Yii::$app->db->createCommand('select  * from by_user where phone=:mobile')
            ->bindParam(':mobile',$mobile,\PDO::PARAM_STR);
        $mobile='13253602577';
        $data=$command->queryOne();
        p($data);
        $mobile='17600662848';
        $data=$command->queryOne();
        p($data);
    }

    public function actionIndex(){
        //重定向
        $this->redirect(['user/user']);
        return 'index';
    }

    public function actionUser(){
        //回到首页
//        $this->goHome();
        //回到上一级
//        $this->goBack();
        return 'user';
    }

    public function actionGetUser(){
        $ob=new User();
        p($ob);
        $data=$ob->findOne(1);

        p($data->username='admin123456');
        p($data->password_hash=password_hash('admin123456',PASSWORD_DEFAULT));

        p($data->save());

    }

    /**
     * 模板练习
     * @return type
     */
    public function actionAddUser(){

        $request=Yii::$app->request;
        p($request->isAjax);
        p($request->isGet);
        p($request->isPost);
        p($request->userIp);
        p($request->userAgent);
        p($request->userHost);
        p($request->getHeaders()->toArray());

        //获取参数
        p($request->post());
        p($request->get());

        //不使用模板
//        return $this->renderPartial('user_add');

        //使用layouts下的main.php模板
         return $this->render('user_add',['data'=>['name'=>'赵大伟','php'=>'yii2']]);
    }

    public function actionEditUser(){

        $model=new User();
        $model=$model::findOne(1);
        return $this->render('user_edit',['model'=>$model]);

    }


}